var geoEventTypeEnums = cc.Enum({
    NONE: -1,
    'geo-cutscene-end': -1,
    'geo-level-end': -1
});

/**
 * 发送事件
 */
var EventEmitter = cc.Class({
    extends: cc.Component,

    properties: {
        eventNode: {
            default: null,
            type: cc.Node,
            tooltip: '发送事件的节点',
        },
        eventTypeEnum: {
            default: geoEventTypeEnums.NONE,
            type: cc.Enum(geoEventTypeEnums),
        },
        rawEventString: {
            default: '',
            tooltip: '事件的字符串值',
        }
    },

    // LIFE-CYCLE CALLBACKS:

    // onLoad () {},
    /**
     * 
     * @param {*} enumOrStringOfEvent 
     */
    emitEvent(enumOrStringOfEvent) {
        // 尝试获取枚举对应的值
        var eventToEmit = this._getEventNameFromEnum(this.eventTypeEnum);
        // 尝试获取原始值
        (this.rawEventString != '') &&
            (eventToEmit = this.rawEventString);
        // 尝试获取EventHandler参数列表中字符串值作为事件原始值，其实也可以获得直接传入
        //的字符串事件值。
        for (var i = 0; i < arguments.length; ++i) {
            var arg = arguments[i];
            if (('string' === typeof arg) && (arg != '')) {
                eventToEmit = arg;
                break;
            }
        }
        // 若最终得到的事件名不是字符串或为空字符串，则不触发事件
        if (('string' !== typeof eventToEmit) || eventToEmit == '')
            return;
        // 正式触发事件
        var node = this._getEventNode();
        node.emit(eventToEmit);
    },
    /**
     * 通过枚举值找到字符串值
     * @param {int} enumId 
     */
    _getEventNameFromEnum(enumId) {
        var eName = geoEventTypeEnums[enumId];
        return (eName == 'NONE') ? '' : eName;
    },
    /**
     * 获取触发事件的节点
     */
    _getEventNode() {
        return this.eventNode || this.node;
    }
});

module.exports = EventEmitter;
